package ThredPool;

import java.util.LinkedList;

/**
 * @Date 2023/11/16 20:35
 * @Author huangdw
 */
//线程池的使用
public class MyTreadPool {
    //1.确定目标：写一个线程池实现1到100的打印并且显示打印的当前线程名称
    //2.确定线程池的具体参数
    //3.确定提交线程任务的方式
    //4.设计运行线程

    //1.定义工作线程的数量
    //2.定义任务队列使用LinkedList（底层是数组就可以定义数量）
    //3.定义工作线程的数组
    //4.构造方法初始化线程池
    //5.启动线程池
    //核心线程数
    private final int corePoolSize;
    //最大线程数
    private final int maxPoolSize;
    //线程空闲时间
    private final long keepAliveTime;
    // 任务队列，用于保存待执行的任务
    private final LinkedList<Runnable> taskQueue;
    // 存储工作线程的数组
    private final WorkerThread[] workerThreads;

    public MyTreadPool(int corePoolSize, int maxPoolSize, long keepAliveTime) {
        this.corePoolSize = corePoolSize;
        this.maxPoolSize = maxPoolSize;
        this.keepAliveTime = keepAliveTime;
        this.taskQueue = new LinkedList<>();
        this.workerThreads = new WorkerThread[maxPoolSize];

        //启动线程
        for (int i = 0; i < corePoolSize; i++) {
            workerThreads[i] = new WorkerThread();
            workerThreads[i].start();
        }
    }

    //表示工作线程
    private class WorkerThread extends Thread {
        @Override
        public void run() {
            while (true) {
                //take是一个变量名，用来引用一个实现了Runnable接口的对象也是指的是当前赋值的任务
                Runnable task = null;

                // 使用同步块确保线程安全，避免多个线程同时访问任务队列
                synchronized (taskQueue) {
                    // 循环等待任务，直到任务队列非空
                    while (taskQueue.isEmpty()) {
                        // 如果任务队列为空，线程进入等待状态，等待被唤醒或等待超时
                        try {
                            taskQueue.wait(keepAliveTime * 100);  // 等待任务，超时则检查线程存活时间
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                        return;
                    }
                    // 从任务队列中取出任务
                    task = taskQueue.poll();
                }

                // 如果取到了任务
                if (task != null) {
                    // 执行任务的run方法
                    task.run();
                }
            }
        }
    }
}
